﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Configuration;
using MySql.Data.MySqlClient;
using System.Windows.Forms;

namespace DAL
{
    /// <summary>
    /// Chargé de récuperer/inserer/supprimer les données relatives aux produits dans la db et de les renvoyer à la couche BU
    /// </summary>
    public static class ProductDataProvider
    {

        // String contenant les données nécessaires pour ce connecter à la base de données
        // Declaré dans app.Config dans la GUI
        public static string ConnectionString = ConfigurationManager.ConnectionStrings["bmg"].ConnectionString;

        /// <summary>
        /// Renvoie tous les produits contenus dans la base de données triés sur le nom
        /// </summary>
        /// <returns>DataTable productDT</returns>
        public static DataTable Fetch()
        {
            try
            {
                using (MySqlConnection connection = new MySqlConnection(ConnectionString))
                {
                    connection.Open();

                    MySqlCommand selectCommand = connection.CreateCommand();
                    selectCommand.CommandText = "SELECT productid, name, price, stock, promo, description, picture, categoryid ";
                    selectCommand.CommandText += "FROM product ";
                    selectCommand.CommandText += "ORDER BY name";

                    DataTable productDT = new DataTable("product");

                    MySqlDataAdapter adapter = new MySqlDataAdapter(selectCommand);
                    adapter.Fill(productDT);

                    return productDT;
                }
            }
            catch
            {

                MessageBox.Show("La connection à la base de données n'a pas pu être effectuée, l'application va être fermée.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Environment.Exit(1);
                return null;
            }
        }

        /// <summary>
        /// Renvoie les produits relatifs à une catégorie déterminée
        /// </summary>
        /// <param name="categoryID">Id de la catégorie pour laquelle des produits doivent être recherchés</param>
        /// <returns>DataTable productDT</returns>
        public static DataTable GetProductList(int categoryID)
        {
            try
            {
                using (MySqlConnection connection = new MySqlConnection(ConnectionString))
                {
                    connection.Open();

                    MySqlCommand selectCommand = connection.CreateCommand();
                    selectCommand.CommandText = "SELECT productid, name, price, stock, promo, description, picture, categoryid ";
                    selectCommand.CommandText += "FROM product ";
                    selectCommand.CommandText += "WHERE categoryid = @categoryid ";
                    selectCommand.CommandText += "ORDER BY name";
                    selectCommand.Parameters.AddWithValue("categoryid", categoryID);

                    DataTable productDT = new DataTable("product");

                    MySqlDataAdapter adapter = new MySqlDataAdapter(selectCommand);
                    adapter.Fill(productDT);

                    return productDT;
                }
            }
            catch
            {

                MessageBox.Show("La connection à la base de données n'a pas pu être effectuée, l'application va être fermée.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Environment.Exit(1);
                return null;
            }
        }

        /// <summary>
        /// Renvoie les produits en promotion
        /// </summary>
        /// <returns>DataTable promoDT</returns>
        public static DataTable GetPromoList()
        {
            try
            {
                using (MySqlConnection connection = new MySqlConnection(ConnectionString))
                {
                    connection.Open();

                    MySqlCommand selectCommand = connection.CreateCommand();
                    selectCommand.CommandText = "SELECT productid, name, price, stock, promo, description, picture, categoryid ";
                    selectCommand.CommandText += "FROM product ";
                    selectCommand.CommandText += "WHERE promo = true";
                    DataTable promoDT = new DataTable();

                    MySqlDataAdapter adapter = new MySqlDataAdapter(selectCommand);
                    adapter.Fill(promoDT);

                    return promoDT;
                }
            }
            catch
            {
                MessageBox.Show("La connection à la base de données n'a pas pu être effectuée, l'application va être fermée.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Environment.Exit(1);
                return null;
            }
        }

        /// <summary>
        /// Renvoie le produit qui correspond à l'id demandé
        /// </summary>
        /// <param name="productID">Id du produit à récupérer dans la db</param>
        /// <returns>DataTable productDT</returns>
        public static DataRow GetProduct(int productID)
        {
            try
            {
                using (MySqlConnection connection = new MySqlConnection(ConnectionString))
                {
                    connection.Open();

                    MySqlCommand selectCommand = connection.CreateCommand();
                    selectCommand.CommandText = "SELECT productid, name, price, stock, promo, description, picture, categoryid ";
                    selectCommand.CommandText += "FROM product ";
                    selectCommand.CommandText += "WHERE productid = @productid";
                    selectCommand.Parameters.AddWithValue("productid", productID);

                    DataTable productDT = new DataTable();

                    MySqlDataAdapter adapter = new MySqlDataAdapter(selectCommand);
                    adapter.Fill(productDT);

                    if (productDT.Rows.Count > 0)
                        return productDT.Rows[0];
                    return null;
                }
            }
            catch
            {

                MessageBox.Show("La connection à la base de données n'a pas pu être effectuée, l'application va être fermée.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Environment.Exit(1);
                return null;
            }
        }

        /// <summary>
        /// Fait la mise à jour des données contenues dans la table product à partir d'une DataTable reçue en paramètre
        /// </summary>
        /// <param name="productDT">DataTable productDT</param>
        public static void Update(DataTable productDT)
        {
            try
            {
                using (MySqlConnection connection = new MySqlConnection(ConnectionString))
                {
                    connection.Open();

                    MySqlDataAdapter adapter = new MySqlDataAdapter("SELECT * FROM product", connection);
                    MySqlCommandBuilder cmdBuilder = new MySqlCommandBuilder(adapter);

                    adapter.UpdateCommand = cmdBuilder.GetUpdateCommand();
                    adapter.Update(productDT);
                }
            }
            catch
            {

                MessageBox.Show("La connection à la base de données n'a pas pu être effectuée, l'application va être fermée.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Environment.Exit(1);
            }
        }

        /// <summary>
        /// Permet d'insérer un nouveau produit dans la base de données
        /// </summary>
        /// <param name="productDT">DataTable productDT</param>
        public static void Insert(DataTable productDT)
        {
            try
            {
                using (MySqlConnection connection = new MySqlConnection(ConnectionString))
                {
                    connection.Open();

                    MySqlDataAdapter adapter = new MySqlDataAdapter("SELECT * FROM product", connection);

                    // Création de la MysqlCommand pour exécuter la stored procedure
                    adapter.InsertCommand = new MySqlCommand("spInsertProduct", connection);
                    adapter.InsertCommand.CommandType = CommandType.StoredProcedure;

                    // Ajout des paramètres d'entrée
                    adapter.InsertCommand.Parameters.Add(new MySqlParameter("name", MySqlDbType.VarChar, 45, "name"));
                    adapter.InsertCommand.Parameters.Add(new MySqlParameter("price", MySqlDbType.Decimal, 6 - 2, "price"));
                    adapter.InsertCommand.Parameters.Add(new MySqlParameter("stock", MySqlDbType.Int64, 0, "stock"));
                    adapter.InsertCommand.Parameters.Add(new MySqlParameter("promo", MySqlDbType.Bit, 1, "promo"));
                    adapter.InsertCommand.Parameters.Add(new MySqlParameter("description", MySqlDbType.VarChar, 120, "description"));
                    adapter.InsertCommand.Parameters.Add(new MySqlParameter("categoryid", MySqlDbType.Int64, 0, "categoryid"));

                    // Ajout d'un paramètre de sortie qui permet de récupérer l'id du produit inséré
                    MySqlParameter parameter = adapter.InsertCommand.Parameters.Add(new MySqlParameter("productid", MySqlDbType.Int64, 0, "productid"));
                    parameter.Direction = ParameterDirection.Output;

                    adapter.Update(productDT);
                }
            }
            catch
            {

                MessageBox.Show("La connection à la base de données n'a pas pu être effectuée, l'application va être fermée.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Environment.Exit(1);
            }
        }

        /// <summary>
        /// Permet de supprimer un produit de la base de données
        /// </summary>
        /// <param name="productDT">DataTable productDT</param>
        public static void Delete(DataTable productDT)
        {
            try
            {
                using (MySqlConnection connection = new MySqlConnection(ConnectionString))
                {
                    connection.Open();

                    MySqlDataAdapter adapter = new MySqlDataAdapter("SELECT * FROM product", connection);
                    MySqlCommandBuilder cmdBuilder = new MySqlCommandBuilder(adapter);

                    adapter.DeleteCommand = cmdBuilder.GetDeleteCommand();
                    adapter.Update(productDT);
                }
            }
            catch
            {

                MessageBox.Show("La connection à la base de données n'a pas pu être effectuée, l'application va être fermée.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Environment.Exit(1);
            }
        }
    }
}
